## Check we can use obj2yaml to yamalize the object
## containing architecture specific dynamic tags.

## Check we can handle MIPS specific tags.
# RUN: yaml2obj --docnum=1 %s -o %t1
# RUN: obj2yaml %t1 | FileCheck %s --check-prefix=MIPS

# MIPS:      - Tag:             DT_MIPS_RLD_VERSION
# MIPS-NEXT:   Value:           0x1
# MIPS-NEXT: - Tag:             DT_MIPS_TIME_STAMP
# MIPS-NEXT:   Value:           0x2
# MIPS-NEXT: - Tag:             DT_MIPS_ICHECKSUM
# MIPS-NEXT:   Value:           0x3
# MIPS-NEXT: - Tag:             DT_MIPS_IVERSION
# MIPS-NEXT:   Value:           0x4
# MIPS-NEXT: - Tag:             DT_MIPS_FLAGS
# MIPS-NEXT:   Value:           0x5
# MIPS-NEXT: - Tag:             DT_MIPS_BASE_ADDRESS
# MIPS-NEXT:   Value:           0x6
# MIPS-NEXT: - Tag:             DT_MIPS_MSYM
# MIPS-NEXT:   Value:           0x7
# MIPS-NEXT: - Tag:             DT_MIPS_CONFLICT
# MIPS-NEXT:   Value:           0x8
# MIPS-NEXT: - Tag:             DT_MIPS_LIBLIST
# MIPS-NEXT:   Value:           0x9
# MIPS-NEXT: - Tag:             DT_MIPS_LOCAL_GOTNO
# MIPS-NEXT:   Value:           0xA
# MIPS-NEXT: - Tag:             DT_MIPS_CONFLICTNO
# MIPS-NEXT:   Value:           0xB
# MIPS-NEXT: - Tag:             DT_MIPS_LIBLISTNO
# MIPS-NEXT:   Value:           0xC
# MIPS-NEXT: - Tag:             DT_MIPS_SYMTABNO
# MIPS-NEXT:   Value:           0xD
# MIPS-NEXT: - Tag:             DT_MIPS_UNREFEXTNO
# MIPS-NEXT:   Value:           0xE
# MIPS-NEXT: - Tag:             DT_MIPS_GOTSYM
# MIPS-NEXT:   Value:           0xF
# MIPS-NEXT: - Tag:             DT_MIPS_HIPAGENO
# MIPS-NEXT:   Value:           0x10
# MIPS-NEXT: - Tag:             DT_MIPS_RLD_MAP
# MIPS-NEXT:   Value:           0x11
# MIPS-NEXT: - Tag:             DT_MIPS_DELTA_CLASS
# MIPS-NEXT:   Value:           0x12
# MIPS-NEXT: - Tag:             DT_MIPS_DELTA_CLASS_NO
# MIPS-NEXT:   Value:           0x13
# MIPS-NEXT: - Tag:             DT_MIPS_DELTA_INSTANCE
# MIPS-NEXT:   Value:           0x14
# MIPS-NEXT: - Tag:             DT_MIPS_DELTA_INSTANCE_NO
# MIPS-NEXT:   Value:           0x15
# MIPS-NEXT: - Tag:             DT_MIPS_DELTA_RELOC
# MIPS-NEXT:   Value:           0x16
# MIPS-NEXT: - Tag:             DT_MIPS_DELTA_RELOC_NO
# MIPS-NEXT:   Value:           0x17
# MIPS-NEXT: - Tag:             DT_MIPS_DELTA_SYM
# MIPS-NEXT:   Value:           0x18
# MIPS-NEXT: - Tag:             DT_MIPS_DELTA_SYM_NO
# MIPS-NEXT:   Value:           0x19
# MIPS-NEXT: - Tag:             DT_MIPS_DELTA_CLASSSYM
# MIPS-NEXT:   Value:           0x1A
# MIPS-NEXT: - Tag:             DT_MIPS_DELTA_CLASSSYM_NO
# MIPS-NEXT:   Value:           0x1B
# MIPS-NEXT: - Tag:             DT_MIPS_CXX_FLAGS
# MIPS-NEXT:   Value:           0x1C
# MIPS-NEXT: - Tag:             DT_MIPS_PIXIE_INIT
# MIPS-NEXT:   Value:           0x1D
# MIPS-NEXT: - Tag:             DT_MIPS_SYMBOL_LIB
# MIPS-NEXT:   Value:           0x1E
# MIPS-NEXT: - Tag:             DT_MIPS_LOCALPAGE_GOTIDX
# MIPS-NEXT:   Value:           0x1F
# MIPS-NEXT: - Tag:             DT_MIPS_LOCAL_GOTIDX
# MIPS-NEXT:   Value:           0x20
# MIPS-NEXT: - Tag:             DT_MIPS_HIDDEN_GOTIDX
# MIPS-NEXT:   Value:           0x21
# MIPS-NEXT: - Tag:             DT_MIPS_PROTECTED_GOTIDX
# MIPS-NEXT:   Value:           0x22
# MIPS-NEXT: - Tag:             DT_MIPS_OPTIONS
# MIPS-NEXT:   Value:           0x23
# MIPS-NEXT: - Tag:             DT_MIPS_INTERFACE
# MIPS-NEXT:   Value:           0x24
# MIPS-NEXT: - Tag:             DT_MIPS_DYNSTR_ALIGN
# MIPS-NEXT:   Value:           0x25
# MIPS-NEXT: - Tag:             DT_MIPS_INTERFACE_SIZE
# MIPS-NEXT:   Value:           0x26
# MIPS-NEXT: - Tag:             DT_MIPS_RLD_TEXT_RESOLVE_ADDR
# MIPS-NEXT:   Value:           0x27
# MIPS-NEXT: - Tag:             DT_MIPS_PERF_SUFFIX
# MIPS-NEXT:   Value:           0x28
# MIPS-NEXT: - Tag:             DT_MIPS_COMPACT_SIZE
# MIPS-NEXT:   Value:           0x29
# MIPS-NEXT: - Tag:             DT_MIPS_GP_VALUE
# MIPS-NEXT:   Value:           0x2A
# MIPS-NEXT: - Tag:             DT_MIPS_AUX_DYNAMIC
# MIPS-NEXT:   Value:           0x2B
# MIPS-NEXT: - Tag:             DT_MIPS_PLTGOT
# MIPS-NEXT:   Value:           0x2C
# MIPS-NEXT: - Tag:             DT_MIPS_RWPLT
# MIPS-NEXT:   Value:           0x2D
# MIPS-NEXT: - Tag:             DT_MIPS_RLD_MAP_REL
# MIPS-NEXT:   Value:           0x2E

--- !ELF
FileHeader:
  Class:             ELFCLASS32
  Data:              ELFDATA2LSB
  Type:              ET_REL
  Machine:           EM_MIPS
Sections:
  - Name:            .dynamic
    Type:            SHT_DYNAMIC
    Entries:
      - Tag:             DT_MIPS_RLD_VERSION
        Value:           0x0000000000000001
      - Tag:             DT_MIPS_TIME_STAMP
        Value:           0x0000000000000002
      - Tag:             DT_MIPS_ICHECKSUM
        Value:           0x0000000000000003
      - Tag:             DT_MIPS_IVERSION
        Value:           0x0000000000000004 
      - Tag:             DT_MIPS_FLAGS
        Value:           0x0000000000000005
      - Tag:             DT_MIPS_BASE_ADDRESS
        Value:           0x0000000000000006
      - Tag:             DT_MIPS_MSYM
        Value:           0x0000000000000007
      - Tag:             DT_MIPS_CONFLICT
        Value:           0x0000000000000008
      - Tag:             DT_MIPS_LIBLIST
        Value:           0x0000000000000009
      - Tag:             DT_MIPS_LOCAL_GOTNO
        Value:           0x000000000000000A
      - Tag:             DT_MIPS_CONFLICTNO
        Value:           0x000000000000000B
      - Tag:             DT_MIPS_LIBLISTNO
        Value:           0x000000000000000C
      - Tag:             DT_MIPS_SYMTABNO
        Value:           0x000000000000000D
      - Tag:             DT_MIPS_UNREFEXTNO
        Value:           0x000000000000000E
      - Tag:             DT_MIPS_GOTSYM
        Value:           0x000000000000000F
      - Tag:             DT_MIPS_HIPAGENO
        Value:           0x0000000000000010
      - Tag:             DT_MIPS_RLD_MAP
        Value:           0x0000000000000011
      - Tag:             DT_MIPS_DELTA_CLASS
        Value:           0x0000000000000012
      - Tag:             DT_MIPS_DELTA_CLASS_NO
        Value:           0x0000000000000013
      - Tag:             DT_MIPS_DELTA_INSTANCE
        Value:           0x0000000000000014
      - Tag:             DT_MIPS_DELTA_INSTANCE_NO
        Value:           0x0000000000000015
      - Tag:             DT_MIPS_DELTA_RELOC
        Value:           0x0000000000000016
      - Tag:             DT_MIPS_DELTA_RELOC_NO
        Value:           0x0000000000000017
      - Tag:             DT_MIPS_DELTA_SYM
        Value:           0x0000000000000018
      - Tag:             DT_MIPS_DELTA_SYM_NO
        Value:           0x0000000000000019
      - Tag:             DT_MIPS_DELTA_CLASSSYM
        Value:           0x000000000000001A
      - Tag:             DT_MIPS_DELTA_CLASSSYM_NO
        Value:           0x000000000000001B
      - Tag:             DT_MIPS_CXX_FLAGS
        Value:           0x000000000000001C
      - Tag:             DT_MIPS_PIXIE_INIT
        Value:           0x000000000000001D
      - Tag:             DT_MIPS_SYMBOL_LIB
        Value:           0x000000000000001E
      - Tag:             DT_MIPS_LOCALPAGE_GOTIDX
        Value:           0x000000000000001F
      - Tag:             DT_MIPS_LOCAL_GOTIDX
        Value:           0x0000000000000020
      - Tag:             DT_MIPS_HIDDEN_GOTIDX
        Value:           0x0000000000000021
      - Tag:             DT_MIPS_PROTECTED_GOTIDX
        Value:           0x0000000000000022
      - Tag:             DT_MIPS_OPTIONS
        Value:           0x0000000000000023
      - Tag:             DT_MIPS_INTERFACE
        Value:           0x0000000000000024
      - Tag:             DT_MIPS_DYNSTR_ALIGN
        Value:           0x0000000000000025
      - Tag:             DT_MIPS_INTERFACE_SIZE
        Value:           0x0000000000000026
      - Tag:             DT_MIPS_RLD_TEXT_RESOLVE_ADDR
        Value:           0x0000000000000027
      - Tag:             DT_MIPS_PERF_SUFFIX
        Value:           0x0000000000000028
      - Tag:             DT_MIPS_COMPACT_SIZE
        Value:           0x0000000000000029
      - Tag:             DT_MIPS_GP_VALUE
        Value:           0x000000000000002A
      - Tag:             DT_MIPS_AUX_DYNAMIC
        Value:           0x000000000000002B
      - Tag:             DT_MIPS_PLTGOT
        Value:           0x000000000000002C
      - Tag:             DT_MIPS_RWPLT
        Value:           0x000000000000002D
      - Tag:             DT_MIPS_RLD_MAP_REL
        Value:           0x000000000000002E

## Check we can handle Hexagon specific tags.
# RUN: yaml2obj --docnum=2 %s -o %t2
# RUN: obj2yaml %t2 | FileCheck %s --check-prefix=HEXAGON

# HEXAGON:      - Tag:             DT_HEXAGON_SYMSZ
# HEXAGON-NEXT:   Value:           0x1
# HEXAGON-NEXT: - Tag:             DT_HEXAGON_VER
# HEXAGON-NEXT:   Value:           0x2
# HEXAGON-NEXT: - Tag:             DT_HEXAGON_PLT
# HEXAGON-NEXT:   Value:           0x3

--- !ELF
FileHeader:
  Class:             ELFCLASS64
  Data:              ELFDATA2LSB
  Type:              ET_REL
  Machine:           EM_HEXAGON
Sections:
  - Name:            .dynamic
    Type:            SHT_DYNAMIC
    Entries:
      - Tag:             DT_HEXAGON_SYMSZ
        Value:           0x1
      - Tag:             DT_HEXAGON_VER
        Value:           0x2
      - Tag:             DT_HEXAGON_PLT
        Value:           0x3

## Check we can handle PPC specific tags.
# RUN: yaml2obj --docnum=3 %s -o %t3
# RUN: obj2yaml %t3 | FileCheck %s --check-prefix=EM_PPC

# EM_PPC:      - Tag:             DT_PPC_GOT
# EM_PPC-NEXT:   Value:           0x20000
# EM_PPC-NEXT: - Tag:             DT_PPC_OPT
# EM_PPC-NEXT:   Value:           0x1

--- !ELF
FileHeader:
  Class:             ELFCLASS32
  Data:              ELFDATA2MSB
  Type:              ET_REL
  Machine:           EM_PPC
Sections:
  - Name:            .dynamic
    Type:            SHT_DYNAMIC
    Entries:
      - Tag:             DT_PPC_GOT
        Value:           0x0000000000020000
      - Tag:             DT_PPC_OPT
        Value:           0x0000000000000001

## Check we can handle PPC64 specific tags.
# RUN: yaml2obj --docnum=4 %s -o %t4
# RUN: obj2yaml %t4 | FileCheck %s --check-prefix=EM_PPC64

# EM_PPC64:      - Tag:             DT_PPC64_GLINK
# EM_PPC64-NEXT:   Value:           0x1

--- !ELF
FileHeader:
  Class:             ELFCLASS64
  Data:              ELFDATA2LSB
  Type:              ET_REL
  Machine:           EM_PPC64
Sections:
  - Name:            .dynamic
    Type:            SHT_DYNAMIC
    Entries:
      - Tag:             DT_PPC64_GLINK
        Value:           0x0000000000000001

## Check we can handle AARCH64 specific tags.
# RUN: yaml2obj --docnum=5 %s -o %t2
# RUN: obj2yaml %t2 | FileCheck %s --check-prefix=AARCH64

# AARCH64:      - Tag:             DT_AARCH64_BTI_PLT
# AARCH64-NEXT:   Value:           0x0
# AARCH64-NEXT: - Tag:             DT_AARCH64_PAC_PLT
# AARCH64-NEXT:   Value:           0x0

--- !ELF
FileHeader:
  Class:             ELFCLASS64
  Data:              ELFDATA2LSB
  Type:              ET_REL
  Machine:           EM_AARCH64
Sections:
  - Name:            .dynamic
    Type:            SHT_DYNAMIC
    Entries:
      - Tag:             DT_AARCH64_BTI_PLT
        Value:           0x0000000000000000
      - Tag:             DT_AARCH64_PAC_PLT
        Value:           0x0000000000000000

## Check we can't use a tag from a different architecture,
## even if it has the same numeric value as a valid tag.
## Here for EM_PPC64 we are trying to use DT_HEXAGON_SYMSZ
## instead of DT_PPC64_GLINK. They both have value of 0x70000000.

# RUN: not yaml2obj --docnum=6 %s 2>&1 | FileCheck %s --check-prefix=ERR
# ERR:      error: invalid hex64 number
# ERR-NEXT: - Tag: DT_HEXAGON_SYMSZ

--- !ELF
FileHeader:
  Class:             ELFCLASS64
  Data:              ELFDATA2LSB
  Type:              ET_REL
  Machine:           EM_PPC64
Sections:
  - Name:            .dynamic
    Type:            SHT_DYNAMIC
    Entries:
      - Tag:             DT_HEXAGON_SYMSZ
        Value:           0x0000000000000001
